import {
  createApp,
  ref
} from 'vue';

import App from './App.vue';

import {
  checkLoginStatus,
  handleWechatCallback,
  getWechatCode,
  getQueryString,
  getWechatAuthUrl
} from '@/utils/login.js';

const app = createApp(App);

const loginModel = {
  isLogin: false, //是否已经登录
  initializing: false, //登录初始化是否在进行
  loginLock: false, //登录流程锁
  isReady: false //登录初始化是否完成
}

// 全局登录状态管理
app.config.globalProperties.$login = {
  // 统一登录初始化方法
  async init() {
    if (loginModel.initializing || loginModel.loginLock) {
      //初始化 || 被锁定 返回isLogin状态
      return loginModel.isLogin;
    }
    //正在初始化， 避免冲突
    loginModel.initializing = true;

    try {
      // 仅在客户端执行登录逻辑
      if (typeof window !== 'undefined') {
        //登录状态
        const status = await checkLoginStatus();
        loginModel.isLogin = status;
        if (!loginModel.isLogin) {
          const query = getQueryString();
          //有token true 没有token false
          if (query.code) {
            // 处理登录回调
            handleWechatCallback(query.code).then(success => {
              if (success) {
                return checkLoginStatus();
              }
              return false;
            }).then((loggedIn) => {
              loginModel.isLogin = loginModel.loggedIn;
              // 登录成功后处理
              if (loginModel.isLogin) {
                // 使用完整URL直接替换当前历史记录并导航
                if (typeof window !== 'undefined') {
                  window.history.replaceState({}, '', '/pages/work/index');
                }
              }
            });
          } else if (!loginModel.loginLock) {
            // 发起微信授权
            loginModel.loginLock = true;
            const authUrl = getWechatAuthUrl();
            window.location.href = authUrl;
            loginModel.loginLock = false;
            return false; // 跳转后终止初始化
          }
        }
      }
    } catch (error) {
      console.error('登录初始化失败:', error);
    }
    loginModel.initializing = false;
    loginModel.isReady = true; //初始化完成
    return loginModel.isLogin;
  }
};
export {
  loginModel
};
app.provide('globalProperties', app.config.globalProperties);
app.mount('#app')